package pe.com.bbva.efcap.servidor.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.stereotype.Repository;

import pe.com.bbva.efcap.servidor.dao.DetalleSimulacionDAO;
import pe.com.bbva.efcap.servidor.modelo.entidad.DetalleSimulacion;
import pe.com.bbva.efcap.servidor.modelo.entidad.Indicador;

@Repository
public class DetalleSimulacionDAOImpl extends EntidadDAOImpl<DetalleSimulacion> implements DetalleSimulacionDAO, Serializable {

	@Override
	public List<DetalleSimulacion> getDetalleSimulacion(int codSimulacion, int codIndicador, int tipoDependencia) throws Exception {
		List list = getSession().createQuery("from "+getEntityClass().getName()+" d "+
				  "where d.simulacion.idSimulacion = :codSimulacion and d.indicador.idIndicador = :codIndicador " +
				  "and d.tipoDependencia >= :tipoDependencia")
				  .setInteger("codSimulacion", codSimulacion)
				  .setInteger("codIndicador", codIndicador)
				  .setInteger("tipoDependencia", tipoDependencia)
				  .list();
		return list;
	}

	@Override
	public List<DetalleSimulacion> getSimulacionPeriodo(int codSimulacion, String catalogo, String tipoDependencia) throws Exception {
	
		List list = getSession().createQuery("from "+getEntityClass().getName()+" d "+
				  "where d.simulacion.idSimulacion = :codSimulacion " +
				  "and d.indicador.tipoCatalogo.nombreCorto = :nombreCorto " +
				  "and (d.tipoDependencia != :tipoDependencia or :tipoDependencia = null)" +
				  "order by periodo, d.indicador.orden")
				  .setInteger("codSimulacion", codSimulacion)
				  .setString("nombreCorto", catalogo)
				  .setString("tipoDependencia", tipoDependencia)
				  .list();
		return list;
	}
	
	@Override
	public List<DetalleSimulacion> getSimulacionProyeccion(int codSimulacion, String catalogo) throws Exception {
		
		List list = getSession().createQuery("from "+getEntityClass().getName()+" d "+
				  "where d.simulacion.idSimulacion = :codSimulacion " +				
				  "and d.indicador.tipoCatalogo.nombreCorto = :nombreCorto " +				  
				  "order by d.periodo, d.indicador.orden, d.tipoDependencia")
				  .setInteger("codSimulacion", codSimulacion)
				  .setString("nombreCorto", catalogo)
				  .list();
		return list;
	}
	
	@Override
	public List<String> getNumeroPeriodo(String codigoSimulacion){
		String hql = "select distinct p.periodo from " + DetalleSimulacion.class.getName() + 
				" p where p.simulacion.idSimulacion = " + codigoSimulacion + "order by p.periodo ";
	 	return getSession().createQuery(hql).list();
	}
	
	@Override
	public Indicador obtenerIndicadorPorCodigo(String codigo, String idSimulacion) {
		String hql = "from "+getEntityClass().getName()+ " i "
				+ "where i.codigo = :codigo and i. = :idSimulacion";
		return (Indicador)getSession().createQuery(hql)
				.setString("codigo", codigo)
				.uniqueResult();
	}
}
